@tool
class_name ContextBehavior_FaceVel
extends BaseContextBehavior

#region 属性
## 默认是否面向右边
@export var is_face_right:bool = true
## 是否允许x轴翻转
@export var flip_h:bool = true
## 是否允许y轴翻转
@export var flip_v:bool = false
## 是否允许通过旋转面向速度方向
@export var enable_rotated:bool = false
#endregion
#region 字段
#endregion
#region 信号
#endregion

#region 基类方法
func init():
	super()
func calc_steering(behaviors_owner:Node,agent:SteeringBehaviorAgent,delta:float):
	super(behaviors_owner,agent,delta)
	var target = agent.entity as Entity
	var runtime_velocity:Vector2 = target.entity_data.get_attribute_value("Vel")
	# 忽略速度为零的情况
	if runtime_velocity.length() < 0.001:
		return true
	
	if enable_rotated:
		var new_scale = Vector2(abs(target.root.scale.x), abs(target.root.scale.y))
		
		# 处理垂直翻转
		if flip_v and runtime_velocity.y < 0:
			new_scale.y *= -1
		
		var angle = runtime_velocity.angle()
		var moving_right = runtime_velocity.x >= 0.001 or (abs(runtime_velocity.x) < 0.001 and target.root.scale.y > 0)
		var should_flip_h = flip_h and (moving_right != is_face_right)
		
		# 核心修改：处理左方向镜像
		if should_flip_h:
			angle += PI
			new_scale.x *= -1  # 添加水平缩放翻转
		elif not is_face_right:
			angle += PI  # 默认朝左时基础角度
		
		# 角度规范化
		angle = fmod(angle, TAU)
		target.root.rotation = angle
		target.root.scale = new_scale
	else:
		# 不旋转时的处理逻辑
		
		# 准备缩放变量
		var new_scale = Vector2(abs(target.root.scale.x), abs(target.root.scale.y))
		
		# 处理垂直翻转（通过缩放）
		if flip_v and runtime_velocity.y < 0:
			new_scale.y *= -1
		
		# 初始旋转
		var base_rotation = 0.0
		
		# 判断朝向和镜像
		var moving_right = runtime_velocity.x >= 0.001 or (abs(runtime_velocity.x) < 0.001 and target.root.scale.y > 0)
		
		# 确定旋转角度
		if is_face_right:
			# 默认朝右
			if not moving_right and flip_h:
				# 如果速度向左且允许水平翻转
				base_rotation = PI
				new_scale.y *= -1
		else:
			# 默认朝左
			if moving_right and flip_h:
				# 如果速度向右且允许水平翻转
				base_rotation = 0
			else:
				# 保持朝左
				base_rotation = PI
		
		# 应用旋转和缩放
		target.root.rotation = base_rotation
		target.root.scale = new_scale
#endregion
#region 公共方法
#endregion
#region 私有方法
#endregion
#region 生命周期函数
func _init() -> void:
	if Engine.is_editor_hint():
		resource_local_to_scene = true
	behavior_type = GameEnum.ContextBehaviorType.FaceVel
func draw() -> void:
	super.draw()
#endregion
